// 类型推论机制 test

// 1. 声明变量并初始化
let a = 1;
a = 'let'; // 报错: 不能将类型“string”分配给类型“number”

// 2. 决定函数返回值
function add(num1: number, num2: number) {
    return num1 + num2;
}
let b = add(3, 5);
b = 'what'; // 报错: 不能将类型“string”分配给类型“number”
// 说明 a,b 已经被类型推论限定类型


// 字面量类型 test

// 1. let / const
let c = "boy" // 类型推论显示 let c: string
const d = "gril" // 类型推论显示 const d: "gril" 字面量类型

// 2. 使用场景
type gender = 'gril' | 'boy';
const stu: gender = "boy"; // 没问题
let stu2: gender = "boy"; // 没问题 使用是和 let const 无关
let stu3: gender = "nobody"; // 报错: 不能将类型“"nobody"”分配给类型“gender”。
let s = 's'; // 类型推论显示 let s: string
let stu4: gender = s; // 报错: 不能将类型“string”分配给类型“gender”。
// 但是 经过 type声明了 联合类型 所以把鼠标移到 gender 上,
// 显示的类型是 type gender = 'gril' | 'boy';
// gender 的两个可选值 属于 字面量类型 而不是string


// 枚举 menu test
// 1. 数值枚举
enum Direction { Up = 10, Down, Left, Right }
console.log(Direction.Up, Direction.Down, Direction.Left, Direction.Right);
// 鼠标挪上去,可以看到 (enum member) Direction.Down = 11 (enum member) Direction.Left = 12
// 数值枚举 默认为：从 0 开始自增的数值 当然，也可以给枚举中的成员初始化值

// 2.字符串枚举：
enum Direction {
    Up1 = 'UP',
    Down1 = 'DOWN',
    Left1 = 'LEFT',
    Right1 = 'RIGHT'
}
// 注意：字符串枚举没有自增长行为，因此，字符串枚举的每个成员必须有初始值


// 统一定义函数格式 test
const add2 = (a: number = 100, b: number = 100): number => {
    return a + b
}
function add1(a: number = 100, b: number = 200): number {
    return a + b
}
// 这里的 add1 和 add2 的参数类型和返回值一致，
// 那么就可以统一定义一个函数类型
type Fn = (n1: number, n2: number) => number
const add3: Fn = (a, b) => { return a + b }
// 这样书写起来就简单多啦

